package main

import "fmt"

// 定义一个游戏角色类Role，包含的属性姓名、武器名称；包含的方法有自我介绍方法say，还有一个攻击的方法attack
// 通过类实例化对象
type Role struct {
	Name   string
	Weapon string
	gender string
}

func (r Role) say() string {
	return fmt.Sprintf("我叫%s 我的是武器是%s", r.Name, r.Weapon)
}
func (r Role) attack(target string) string {
	return fmt.Sprintf("%s正在攻击%s", r.Name, target)
}

// 接受者是一个结构体类型变量，会拷贝过来当前变量的值，操作的时候，不再是之前的值
// 而是拷贝后的值
// 如果想要修改之前变量的值，需要传递变量的指针
func (r *Role) setWeapon(newWeapon string) {
	r.Weapon = newWeapon
}

func main() {
	// 实例化对象
	// r1 := Role{"张飞", "丈八蛇矛"}
	// fmt.Println(r1.say())
	// fmt.Println(r1.attack("曹操"))
	// r2 := Role{"吕布", "方天画戟"}
	// fmt.Println(r2.attack("张飞"))
	// r2.setWeapon("青龙偃月刀")
	// fmt.Println(r2)
	// r3 := Role{"貂蝉", "手绢", "女"}
	// fmt.Println(r3.Name, r3.gender)

	// 类中成员名称小写字母开头的，禁止外部访问、
	// 如果要实现以上功能，需要借助工厂函数
	// 工厂函数：每次可以创建对象，对象中就可以实现封装（首字母大小写区别）

}
